package com.example.rocketmq.demo.producer;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

/**
 * 基于注解方式的事务消息监听器
 */
@Slf4j
@Component
@RocketMQTransactionListener
public class AnnotationTransactionListener implements RocketMQLocalTransactionListener {

    /**
     * 执行本地事务
     *
     * @param msg 消息
     * @param arg 附加参数
     * @return 本地事务状态
     */
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        String transactionId = msg.getHeaders().getId().toString();
        log.info("开始执行本地事务, 事务ID: {}, 消息内容: {}", transactionId, new String((byte[]) msg.getPayload()));
        
        try {
            // 获取传入的事务状态参数
            String status = (String) arg;
            
            // 根据传入的状态参数模拟不同的本地事务执行结果
            if ("COMMIT".equals(status)) {
                // 模拟本地事务执行成功
                log.info("本地事务执行成功, 事务ID: {}", transactionId);
                return RocketMQLocalTransactionState.COMMIT;
            } else if ("ROLLBACK".equals(status)) {
                // 模拟本地事务执行失败
                log.info("本地事务执行失败, 事务ID: {}", transactionId);
                return RocketMQLocalTransactionState.ROLLBACK;
            } else {
                // 模拟本地事务执行未知状态
                log.info("本地事务执行未知, 事务ID: {}", transactionId);
                return RocketMQLocalTransactionState.UNKNOWN;
            }
        } catch (Exception e) {
            log.error("本地事务执行异常, 事务ID: {}", transactionId, e);
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }

    /**
     * 检查本地事务状态（回查）
     *
     * @param msg 消息
     * @return 本地事务状态
     */
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        String transactionId = msg.getHeaders().getId().toString();
        log.info("回查本地事务状态, 事务ID: {}, 消息内容: {}", transactionId, new String((byte[]) msg.getPayload()));
        
        // 这里应该查询本地事务执行记录，判断事务是否执行成功
        // 本示例中简化处理，直接返回COMMIT
        return RocketMQLocalTransactionState.COMMIT;
    }
}